package cn.thread;

import cn.hutool.core.convert.Convert;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 产品
 *
 * @author dunlingzi
 */
public class Product {
    /**
     * 已生产的产品总量
     */
    private static Integer totalProduct = 0;

    /**
     * 采用并发包的原子包装类型 error错误：
     * 原因：AtomicInteger能保证自增的结果一定是正确的，但是不能保证每次获取的都是当前生产者的产品号
     * 例如：A/B/C三个线程
     * A生产了产品1号，输出A生产产品1号 此时产品号为totalProduct=1
     * 由于是原子操作，B获取正确的totalProduct=1，在此基础上自增+1，生产了产品2号，此时totalProduct=2
     * C同样获取了正确的产品号，原子操作自增+1，生产产品3号，输出C生产了产品3号
     * B此时获取到了输出，B获取最新的值，B生产了产品3号
     */
    //private static AtomicInteger totalProduct = new AtomicInteger(0);

    /**
     * 产品id(生产日期 + 产品总量)
     */
    private String id = null;

    public Product() {
        this.id = generateId();
    }

    private String generateId() {
        /*totalProduct.getAndIncrement();
        System.out.println("totalProduct：" + totalProduct.);
        return Convert.toStr(totalProduct.get());*/

        //类锁 由于所有线程的Product对象不同，使用类锁使得所有使用该类对像的线程在此处同步
        synchronized (Product.class) {   
            ++totalProduct;
            return Convert.toStr(totalProduct);
        }
    }

    public String getId() {
        return id;
    }
}